package org.example.volunteerend.service;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Map;

import org.example.volunteerend.dto.AdminInvitationRequest;
import org.example.volunteerend.dto.AdminProjectReviewRequest;
import org.example.volunteerend.dto.PageResponse;
import org.example.volunteerend.dto.ProjectCategoryRequest;
import org.example.volunteerend.entity.AdminOperationLog;
import org.example.volunteerend.entity.ProjectCategory;
import org.springframework.web.multipart.MultipartFile;

import jakarta.servlet.http.HttpServletRequest;

public interface AdminService {
    /**
     * 生成管理员邀请码
     * 
     * @param request 请求参数
     * @return 生成的邀请码信息
     */
    Map<String, Object> generateInvitationCode(AdminInvitationRequest request);
    
    /**
     * 获取管理员操作日志
     * 
     * @param adminId 管理员ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param operationType 操作类型
     * @param page 页码
     * @param pageSize 每页数量
     * @return 操作日志列表
     */
    PageResponse<AdminOperationLog> getOperationLogs(
            Integer adminId,
            LocalDateTime startTime,
            LocalDateTime endTime,
            String operationType,
            Integer page,
            Integer pageSize);
    
    /**
     * 审核项目
     * 
     * @param projectId 项目ID
     * @param request 审核请求
     * @return 审核结果
     */
    Map<String, Object> reviewProject(Integer projectId, AdminProjectReviewRequest request);
    
    /**
     * 记录管理员操作
     * 
     * @param adminId 管理员ID
     * @param operationType 操作类型
     * @param operationDescription 操作描述
     * @param request HTTP请求
     */
    void logAdminOperation(Integer adminId, String operationType, String operationDescription, HttpServletRequest request);
    
    /**
     * 获取管理员统计数据
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 统计数据
     */
    Map<String, Object> getStatistics(LocalDate startDate, LocalDate endDate);
    
    /**
     * 添加项目分类
     * 
     * @param request 分类请求
     * @return 添加的分类信息
     */
    ProjectCategory addProjectCategory(ProjectCategoryRequest request);
    
    /**
     * 更新分类图标
     * 
     * @param categoryId 分类ID
     * @param iconFile 图标文件
     * @return 更新结果
     * @throws Exception 上传异常
     */
    Map<String, String> updateCategoryIcon(Integer categoryId, MultipartFile iconFile) throws Exception;
} 